﻿// (c) Comkarl Calipso
// By Matías Fidemraizer (http://www.matiasfidemraizer.com)
// -------------------------------------------------
// http://calipso.codeplex.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using Comkarl.Web.Configuration;
using System;
using System.Linq;

namespace Comkarl.Web
{
    internal static class Component
    {
        internal static TComponent Resolve<TComponent>(string id)
            where TComponent : class
        {
            TComponent component = default(TComponent);
            ComponentElement componentConfig = RuntimeEnvironment.Components.Single(element => element.Id == id);

            Type componentType = Type.GetType(componentConfig.TypeName);

            if (componentType != null && typeof(TComponent) == componentType)
            {
                Type implementationType = Type.GetType(componentConfig.ImplementationTypeName);

                if (implementationType != null && componentType.IsAssignableFrom(implementationType))
                {
                    component = (TComponent)Activator.CreateInstance(implementationType);
                }
                else
                {
                    throw new InvalidOperationException("Implementation does not inherit or implement the whole component type");
                }
            }
            else
            {
                throw new InvalidOperationException("No implementation cloud be found");
            }

            return component;
        }
    }
}